<?php
/////////////////////////////////////////////////////////////////////////////
// 
//
// workflow_system
//
// workflow_copyright
// 
/////////////////////////////////////////////////////////////////////////////

/**
 * FILE_NAME : commonvalidate.php   FILE_PATH : classes\libraries\commonvalidate.class.php
 * ....通用验证类
 *
 * @copyright workflow_system
 * @author workflow Develop Team 
 * @package
 * @subpackage
 * @version Wed Aug 08 18:32:45 CST 2007
 */

/*
+------------------------------------------------------------------------------------------------------
|   功能说明： 验证类.
|   调用部分 ：
|   ========================================
|
|
|	require("commonvalidate.class.php");
|	$a = new CommonValidate();
|	$a->setValidate("344d",true,"","不可以为空");
|	$a->setValidate("fdsfsfd",true,"Email","请填写正确的EMAIL");
|	echo $a->validate();
|
|   显示结果：
|   ●请填写正确的EMAIL
+------------------------------------------------------------------------------------------------------
*/
Class CommonValidate{
	/**
	 * 需要验证的内容
	 *input要验证的值，require是否必须有值，validator验证的类别，message错误的信息
	 * @var array(0=>array("input"=>"","require"=>0,"validator"=>"","message"=>""))
	 */
	var $validateparam = array();
	var $validator = array(
	"Email"=>"^([\.a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+",
	"Phone"=>"^((\([0-9]{2,3}\))|([0-9]{3}\-))?(\(0[0-9]{2,3}\)|0[0-9]{2,3}-)?[1-9][0-9]{6,7}(\-[0-9]{1,4})?\$",
	"Mobile"=>"^((\([0-9]{2,3}\))|([0-9]{3}\-))?1[0-9]{10}\$",
	"Url"=>"^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*\$",
	"Currency"=>"^[0-9]+(\.[0-9]+)?\$",
	"Number"=>"^[0-9]+\$",
	"Zip"=>"^[0-9][0-9]{5}\$",
	"QQ"=>"^[1-9][0-9]{4,8}\$",
	"Integer"=>"^[-\+]?[0-9]+\$",
	"Double"=>"^[-\+]?[0-9]+(\.[0-9]+)?\$",
	"English"=>"^[A-Za-z]+\$",
	"Chinese"=>"^[\u0391-\uFFE5]+\$",
	"Username"=>"^[a-zA-Z\w]{3,}\$",
	"UnSafe"=>"^(([A-Z]*|[a-z]*|[0-9]*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})\$|\s",
	"NoChinese"=>"^[A-Za-z0-9_-]+\$",
	);


	/**
	 * 验证数组中的值
	 *
	 * @return unknown
	 */
	function validate(){
		if (!is_array($this->validateparam)){
			return false;
		}
		foreach($this->validateparam as $k=>$v){
			if ($v['require'] == ""){
				$v['require'] = false;
			}

			if ($v['input'] == "" && $v['require'] == "true"){
				$this->validateparam[$k]['result'] = false;
			}else{
				$this->validateparam[$k]['result'] = true;
			}

			if ($this->validateparam[$k]['result']){
				switch($v['validator']){
					case "Custom":
						$this->validateparam[$k]['result'] = $this->_check($v['input'],$v['regexp']);
						break;
					case "Compare":
						if ($v['operator'] != "" && $v['to'] != ""){
							eval("\$result = '" . $v['input'] . "'" . $v['operator'] . "'" . $v['to'] . "'" . ";" );
							$this->validateparam[$k]['result'] = $result;
						}
						break;
					case "Length":
						if (intval($v['min']) >= 0 && intval($v['max']) > intval($v['min'])){
							$this->validateparam[$k]['result'] = (strlen($v['input']) >= intval($v['min']) && strlen($v['input']) <= intval($v['max']));
						}
						else if (intval($v['min']) >= 0 && intval($v['max']) <= intval($v['min'])){
							$this->validateparam[$k]['result'] = (strlen($v['input']) == intval($v['min']));
						}
						break;
					case "Range":
						if (intval($v['min']) >= 0 && intval($v['max']) > intval($v['min'])){
							$this->validateparam[$k]['result'] = (intval($v['input']) >= intval($v['min']) && intval($v['input']) <= intval($v['max']));
						}
						else if (intval($v['min']) >= 0 && intval($v['max']) <= intval($v['min'])){
							$this->validateparam[$k]['result'] = (intval($v['input']) == intval($v['min']));
						}
						break;
					default:
						$this->validateparam[$k]['result'] = $this->_check($v['input'],$this->validator[$v['validator']]);
				}
			}
		}
		$error = $this->getError();
		$this->validateparam = array();
		return $error;
	}

	/**
	 * 正则表达式运算
	 *
	 * @param unknown_type $str
	 * @param unknown_type $validator
	 * @return unknown
	 */
	function _check($str='',$validator=''){
		if ($str != "" && $validator != ""){
			if (ereg($validator,$str)){
				return true;
			}
			else{
				return false;
			}
		}
		return true;
	}

	/**
	 * 需要验证的内容
	 *
	 * @param string $input  要验证的值
	 * @param bool $require 是否必须有值
	 * @param string $validator 验证的类别
	 * @param string $compare 用来比较的操作：==，>=，<=，<，>，!=
	 * @param string $comparevalue 用来比较的值
	 * @param string $message 错误的信息
	 */
	/*
	function setValidate($input="",$require=false,$validator="",$compare="",$comparevalue="",$message=""){
	$this->validateparam = array_merge($this->validateparam,array(array("input"=>$input,"require"=>$require,"validator"=>$validator,"message"=>$message,"result"=>true)));

	}
	*/
	/**
	 * 需要验证的内容
	 *
	 * @param var[] $validateparam array("input"=>"","require"=>"","validator"=>"","regexp"=>"","operator"=>"","to"=>"","min"=>"","max"=>"",message=>"")
	 * input要验证的值
	 * require是否必填，true是必填false是可选
	 * validator验证的类型，其中Compare，Custom，Length,Range比较特殊。Compare是用来比较2个字符串或数字，operator和to用来配合使用，operator是比较的操作符(==,>,<,>=,<=,!=)，to是用来比较的字符串；Custom是定制验证的规则，regexp用来配合使用，regexp是正则表达试；Length是验证字符串或数字的长度是否在一顶的范围内，min和max用来配合使用，min是最小的长度，max是最大的长度，如果不写max则被认为是长度必须等于min;Range是数字是否在某个范围内，min和max用来配合使用。值得注意的是，如果需要判断的规则比较复杂，建议直接写正则表达式。
	 * message报错信息
	 */
	function setValidate($validateparam){
		$validateparam["result"] = true;
		$this->validateparam = array_merge($this->validateparam,array($validateparam));
	}

	/**
	 * 得到验证的错误信息
	 *
	 * @return string
	 */
	function getError(){
		$error = "";
		foreach($this->validateparam as $k=>$v){
			if ($v['result'] == false){
			//	$error .= "<li>" . $v['message'] . "</li>";  //白菜修改，以后要使用很多AJAX回调，我考虑去掉了xhtml格式。
				$error .= $v['message']."<br />";
			}
		}
		return $error;
	}
}
?>